import { findCartList, mergeLocalCart, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  mutations: {
    // 存储从服务器获取的购物车数据
    setList(state, list) {
      state.list = list
    },
    // 添加到购物车 good为商品对象
    addCart(state, good) {
      const addIndex = state.list.findIndex(item => item.skuId === good.skuId)
      if (addIndex > -1) {
        state.list[addIndex].count += good.count
      } else {
        state.list.unshift(good)
      }
    },
    // 更改商品数量
    changeCount(state, { good, count }) {
      const item = state.list.find(item => item.skuId === good.skuId)
      item.count = count
    },
    // 单选
    singelCheck(state, { good, isChecked }) {
      // 找到要做单选的商品数据
      const currGood = state.list.find(item => item.skuId === good.skuId)
      // 修改勾选状态
      currGood.selected = isChecked
    },
    // 全选
    allCheck(state, isAll) {
      state.list.forEach(item => {
        item.selected = isAll
      })
    },
    // 删除商品
    delCart(state, good) {
      const delIndex = state.list.findIndex(item => item.skuId === good.skuId)
      state.list.splice(delIndex, 1)
    }
  },
  actions: {
    // 存储从服务器获取的购物车数据
    async getListAction({ commit }) {
      const result = await findCartList()
      commit('setList', result)
    },
    // 添加到购物车
    async addCartAction({ commit, rootState, dispatch }, good) {
      // rootState === store.state  可获取其他模块state数据
      if (rootState.user.profile.token) {
        // 已登录 商品存到数据库
        await insertCart({ skuId: good.skuId, count: good.count })
        // 重新获取购物车数据
        dispatch('getListAction')
        return '加入成功！'
      } else {
        // 未登录
        commit('addCart', good)
        return '加入成功！'
      }
    },
    // 合并购物车
    async mergeCartAction({ state, dispatch }) {
      if (state.list.length > 0) {
        // mergeData需要合并的购物车数据
        const mergeData = state.list.map(item => {
          return {
            skuId: item.skuId,
            selected: item.selected,
            count: item.count
          }
        })
        await mergeLocalCart(mergeData)
      }
      // 从服务器获取购物车数据
      dispatch('getListAction')
    },
    // 单选
    async singelCheckAction({ commit, rootState, dispatch }, { good, isChecked }) {
      if (rootState.user.profile.token) {
        // 已登录
        await updateCart({ ...good, selected: isChecked })
        // 重新获取购物车数据
        dispatch('getListAction')
      } else {
        // 未登录
        commit('singelCheck', { good, isChecked })
      }
    },
    // 全选
    async allCheckAction({ commit, rootState, dispatch, getters }, isAll) {
      if (rootState.user.profile.token) {
        // 已登录
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: isAll, ids })
        // 重新获取购物车数据
        dispatch('getListAction')
      } else {
        // 未登录
        commit('allCheck', isAll)
      }
    },
    // 删除商品
    async delCartAction({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 已登录
        await deleteCart([good.skuId])
        // 重新获取购物车数据
        dispatch('getListAction')
      } else {
        // 未登录
        commit('delCart', good)
      }
    },
    // 更改商品数量
    async changeCountAction({ commit, rootState, dispatch }, { good, count }) {
      if (rootState.user.profile.token) {
        // 已登录
        await updateCart({ ...good, count })
        // 重新获取购物车数据
        dispatch('getListAction')
      } else {
        // 未登录
        commit('changeCount', { good, count })
      }
    }
  },
  getters: {
    // 有效商品列表
    validList: state => {
      return state.list.filter(item => item.isEffective)
    },
    // 选中的购物车商品数据
    validSeled: (state, getters) => {
      return state.list.filter(item => item.selected)
    },
    // 选中的购物车商品数据总价
    validSeledTotal: (state, getters) => {
      return getters.validSeled.reduce((acc, item) => (acc += item.count * item.nowPrice), 0)
    },
    // 有效商品是否全部选中状态
    isAll: (state, getters) => {
      return getters.validList.every(item => item.selected)
    }
  }
}